﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using vudu.ClasesDominio;
using vudu.Logica.Excepciones;
using vudu.Logica.Fachada;
using vudu.Presentacion.Contrato.VU_13_Gestionar_Horarios;

namespace vudu.Presentacion.Presentador.VU_13_Gestionar_Horarios
{
    public class PresentadorModificarPrematricula1
    {
        #region Variables
        private IContratoModificarPrematricula1 _vista;
        private EnlaceLogico _fachada = new EnlaceLogico();
        private List<Materia> _misMateriasPrematricula = new List<Materia>();
        private List<SeccionMateria> _misSeccionesPrematriculas = new List<SeccionMateria>();
        private List<Materia> _misMateriasSeleccionadasEnPrematricula = new List<Materia>();
        private const string MensajeSeleccionarAlMenosUna = "Operacion Fallida: Debe seleccionar al menos un elemento.";
        private const string MensajeExcedioLimiteDeCreditos = "Operacion Fallida: Ha seleccionado mas materias de las que puede ver.";
        private const string CabeceraError = "Operacion Fallida: ";
        private const int MaximoDeCreditos = 21;
        #endregion

        #region gets & sets
        public List<Materia> MisMateriasSeleccionadasEnPrematricula
        {
            get { return _misMateriasSeleccionadasEnPrematricula; }
            set { _misMateriasSeleccionadasEnPrematricula = value; }
        }

        public List<Materia> MisMateriasPrematricula
        {
            get { return _misMateriasPrematricula; }
            set { _misMateriasPrematricula = value; }
        }

        public List<SeccionMateria> MisSeccionesPrematriculas
        {
            get { return _misSeccionesPrematriculas; }
            set { _misSeccionesPrematriculas = value; }
        }
        #endregion

        //Constructor
        public PresentadorModificarPrematricula1(IContratoModificarPrematricula1 vista,EnlaceLogico fachada)
        {
            try
            {
                _vista = vista;
                _fachada = fachada;
                Estudiante estudiante = new Estudiante();
                estudiante = (Estudiante)_fachada.RolActual;
                _vista.UxInformacionEstudiante.Text = estudiante.Nombre + " " + estudiante.Apellido;
                CargarInformacionEstudiante(estudiante);
                MisMateriasPrematricula = _fachada.ConsultarMateriasPrematricula(estudiante, 1);
            }
            catch (ConexionExeption e)
            {
                _vista.UxMensajeTransaccion.Text = CabeceraError + e.Message;
                _vista.UxMensajeTransaccion.Visible = true;
                _vista.BotonAceptar.Visible = false;
                _vista.BotonCancelar.Visible = false;
            }
            catch (NoHayMateriasEnPrematriculaException e)
            {
                _vista.UxMensajeTransaccion.Text = CabeceraError + e.Message;
                _vista.UxMensajeTransaccion.Visible = true;
                _vista.BotonAceptar.Visible = false;
                _vista.BotonCancelar.Visible = false;
            }
            catch (InformacionEstudianteException e)
            {
                _vista.UxMensajeTransaccion.Text = CabeceraError + e.Message;
                _vista.UxMensajeTransaccion.Visible = true;
                _vista.BotonAceptar.Visible = false;
                _vista.BotonCancelar.Visible = false;
            }
            finally
            {
                _vista.UxMensajeTransaccion.CssClass = "transaccionFallida";
            }
        }

        //Metodo que permite cargar la pagina.
        public void Pageload()
        {
            //cuando se integre aqui va la parte de la session
            CargarTabla(MisMateriasPrematricula);
        }

        #region Metodos
        //Metodo que cancela el caso de uso en el paso uno, llamando a PresentadorNuevaPrematricula
        public void AccionBotonCancelarPasoUno()
        {
        }

        //Metodo que permite pasar para el segundoPaso, llamando a PresentadorNuevaPrematricula
        /// <summary>
        /// Metodo que permite pasar para el segundoPaso, llamando a PresentadorNuevaPrematricula
        /// </summary>
        public bool AccionBotonSiguientePasoUno()
        {
            bool respuesta;
            //Si selecciono al menos una materia en la prematricula
            if (SeleccionoAlMenosUna())
            {
                //Se chequea si no excedio el limite de creditos en su seleccion
                if (NoExcedioElLimiteDeCreditos())
                {
                    _vista.UxMensajeTransaccion.Visible = false;
                    MisMateriasSeleccionadasEnPrematricula = ObtenerMateriasSeleccionadas();
                    respuesta = true;
                }
                //Si lo excedio se muestra el mensaje de error
                else
                {
                    _vista.UxMensajeTransaccion.Text = MensajeExcedioLimiteDeCreditos;
                    _vista.UxMensajeTransaccion.CssClass = "transaccionFallida";
                    _vista.UxMensajeTransaccion.Visible = true;
                    respuesta = false;
                }
            }
            //Si no se selecciono
            else
            {
                _vista.UxMensajeTransaccion.Text = MensajeSeleccionarAlMenosUna;
                _vista.UxMensajeTransaccion.CssClass = "transaccionFallida";
                _vista.UxMensajeTransaccion.Visible = true;
                respuesta = false;
            }
            return respuesta;
        }

        /// <summary>
        /// Funcion que permite saber si se selecciono al menos una materia para la prematricula
        /// </summary>
        /// <returns>true si selecciono, false en el caso contrario</returns>
        public bool SeleccionoAlMenosUna()
        {
            int contador = 0;
            List<Materia> misMateriasSeleccionadas = new List<Materia>();
            //Se recorre toda el gridview y las materias que sean seleccionadas se incluyen en la lista.
            for (int i = 0; i < _vista.UxMateriasElegibles.Rows.Count; i++)
            {
                GridViewRow row = _vista.UxMateriasElegibles.Rows[i];
                CheckBox check = (CheckBox)row.FindControl("chkSeleccionEscoger");
                if (check.Checked)
                {
                    contador++;
                }
            }
            return (contador > 0);
        }

        /// <summary>
        /// Funcion que indica si el estudiante no excedio el limite de creditos.
        /// </summary>
        /// <returns></returns>
        public bool NoExcedioElLimiteDeCreditos()
        {
            int contador = 0;
            List<Materia> misMateriasSeleccionadas = new List<Materia>();
            //Se recorre toda el gridview y las materias que sean seleccionadas se incluyen en la lista.
            for (int i = 0; i < _vista.UxMateriasElegibles.Rows.Count; i++)
            {
                GridViewRow row = _vista.UxMateriasElegibles.Rows[i];
                CheckBox check = (CheckBox)row.FindControl("chkSeleccionEscoger");
                if (check.Checked)
                {
                    contador += MisMateriasPrematricula.ElementAt(i).NumeroCreditos;
                }
            }
            return (contador < MaximoDeCreditos);
        }

        /// <summary>
        /// Funciono que optiene las materias seleccionadas de la prematriculas
        /// </summary>
        /// <returns></returns>
        public List<Materia> ObtenerMateriasSeleccionadas()
        {
            int _counterCredits = 0;
            List<Materia> misMateriasSeleccionadas = new List<Materia>();
            for (int i = 0; i < _vista.UxMateriasElegibles.Rows.Count; i++)
            {
                GridViewRow row = _vista.UxMateriasElegibles.Rows[i];
                CheckBox check = (CheckBox)row.FindControl("chkSeleccionEscoger");
                if (check.Checked)
                {
                    misMateriasSeleccionadas.Add(MisMateriasPrematricula.ElementAt(i));
                }
            }
            return misMateriasSeleccionadas;
        }

        /// <summary>
        /// Funcion que carga en la tabla las opciones uqe puede ver.
        /// </summary>
        /// <param name="misMAteriasCandidatas"></param>
        public void CargarTabla(List<Materia> misMAteriasCandidatas)
        {
            DataTable tabla = new DataTable();
            tabla.Columns.Add("Semestre", typeof(int));
            tabla.Columns.Add("Materia", typeof(string));
            tabla.Columns.Add("Credito", typeof(int));
            foreach (Materia materia in misMAteriasCandidatas)
            {
                tabla.Rows.Add(materia.Semestre, materia.Nombre, materia.NumeroCreditos);
            }
            _vista.UxMateriasElegibles.DataSource = tabla;
            _vista.UxMateriasElegibles.DataBind();

        }

        /// <summary>
        /// Funcion que carga la informacion del estudiante.
        /// </summary>
        /// <param name="estudiante"></param>
        public void CargarInformacionEstudiante(Estudiante estudiante)
        {
            DataTable tabla = new DataTable();
            tabla.Columns.Add("Nombre", typeof(string));
            tabla.Columns.Add("Escuela", typeof(string));
            tabla.Columns.Add("Maximo de creditos", typeof(int));
            estudiante = _fachada.ConsultarInformacionEstudiante(estudiante);
            tabla.Rows.Add(estudiante.Nombre, estudiante.Apellido, estudiante.Cedula);
            _vista.UxInformacionUsuario.DataSource = tabla;
            _vista.UxInformacionUsuario.DataBind();

        }

        #endregion
    }
}